package com.han.hotelplat.comm.base;

import java.util.List;

import org.hibernate.type.NullableType;
/**
 * 
 * TODO  DAO基类接口
 * @date    2013-11-8 上午09:42:49 
 * @author  han1088
 * @version 1.0.0
 *
 * @param <T> 泛类
 */
@SuppressWarnings({"rawtypes"})
public interface IBaseDAO<T>
{

	/**
	 * 
	 * TODO  保存
	 * @param obj object 对象
	 */
	public  void save(T obj);

	/**
	 * 
	 * TODO  批量保存
	 * @param 对象list 
	 */
	public  void saveAll(List<T> list);
	
	/**
	 * 
	 * TODO  更新
	 * @param obj object 对象
	 */
	public  void update(T obj);
	
	/**
	 * 
	 * TODO  批量更新
	 * @param 对象list 
	 */
	public  void updateAll(List<T> list);
	
	/**
	 * 
	 * TODO  HQL 语句更新
	 * @param HQL HQL语句
	 * @return 更新结果 大于0成功
	 */
	public  int updateByHQL(String HQL);
	
	/**
	 * 
	 * TODO  HQL语句 + Object参数更新
	 * @param HQL HQL语句
	 * @param obj Object参数
	 * @return 更新结果 大于0成功
	 */
	public  int updateByHQL(String HQL, Object obj);
	
	/**
	 * 
	 * TODO  HQL语句 + Object参数数组更新
	 * @param HQL HQL语句
	 * @param objs Object参数数组
	 * @return 更新结果 大于0成功
	 */
	public  int updateByHQL(String HQL, Object[] objs);
	
	/**
	 * 
	 * TODO  SQL 语句更新
	 * @param SQL SQL语句
	 * @return 更新结果 大于0成功
	 */
	public  int updateBySQL(final String SQL);

	/**
	 * 
	 * TODO  SQL 语句+Object 参数 更新
	 * @param SQL SQL语句
	 * @param obj Object参数
	 * @return 更新结果 大于0成功
	 */
	public  int updateBySQL(final String SQL, final Object obj);

	/**
	 * 
	 * TODO  SQL 语句+Object 参数数组 +指定数据类型  更新
	 * @param SQL SQL语句
	 * @param objs Object 参数数组
	 * @param types 指定的Hibernate数据类型
	 * 		（Hibernate.STRING,
	 *        Hibernate.INTEGER,
	 *        Hibernate.DATE等等）
	 * @return 更新结果 大于0成功
	 */
	public  int updateBySQL(final String SQL, final Object[] objs,
			final NullableType[] types);
	
    /**
     * 
     * TODO  根据对象属性值删除数据
     * @param keyName 属性名
     * @param keyValue 属性值
     * @return 删除结果 大于0成功
     */
	public  int deleteByProperty(String keyName, Object keyValue);

	/**
	 * 
	 * TODO  根据id 批量删除数据
	 * @param ids id数组
	 * @return 删除结果
	 */
	public Integer deleteByIds(Integer[] ids);
	
	/**
	 * 
	 * TODO  根据Object id 删除数据
	 * @param keyValue Object id值
	 * @return 删除对象
	 */
	public  T deleteById(Object keyValue);
	
	/**
	 * 
	 * TODO  根据Object 对象删除数据
	 * @param obj 删除对象
	 */
	public  void delete(T obj);

	/**
	 * 
	 * TODO  根据Object id 查找对象
	 * @param key Object id值
	 * @return 查找对象
	 */
	public  T findById(Object key);
	
	/**
	 * 
	 * TODO  根据HQL语句+Object参数 查找对象list
	 * @param HQL HQL语句
	 * @param args Object参数
	 * @return 对象list
	 */
	public List findByHQL(String HQL, Object args);

	/**
	 * 
	 * TODO  根据对象属性名和属性值 查找对象列表
	 * @param propertyName 属性名
	 * @param value 属性值
	 * @return 对象list
	 */
	public  List findByProperty(String propertyName, Object value);

	/**
	 * 
	 * TODO  根据HQL语句查找对象list
	 * @param HQL HQL语句
	 * @return 对象list
	 */
	public  List findByHQL(String HQL);

	/**
	 * 
	 * TODO  根据HQL语句+Object参数数组查找对象列表
	 * @param HQL HQL语句
	 * @param args 参数数组
	 * @return 对象list
	 */
	public  List findByHQL(String HQL, Object[] args);


	
	/**
	 * 
	 * TODO  SQL 语句+Object 参数list +页码+分页数据大小 查找对象list
	 * @param filterSQL SQL语句
	 * @param paras Object 参数数组
	 * @param first 页码
	 * @param size 分页数据大小
	 * @return 对象list
	 */
	public  List findPage(final String filterSQL, final List<Object> paras,
			final int first, final int size);

	/**
	 * 
	 * TODO  SQL 语句+Object 参数list 查找数据大小
	 * @param filterSQL SQL语句
	 * @param paras Object 参数list
	 * @return 数据大小
	 */
	public  int findCount(final String filterSQL, final List<Object> paras);
	
	public void sessionFlush();
	
	public List findAll(String tablename);
	
	public List findBySql(String sql);

	public List<T> findAll();
}